package convert

import "strconv"

type StrTo string

func (s StrTo) String() string {
	return string(s)
}

func (s StrTo) Int() (int, error) {
	v, err := strconv.Atoi(s.String())
	return v, err
}

func (s StrTo) MustInt() int {
	v, _ := s.Int()
	return v
}

func (s StrTo) UInt32() (uint32, error) {
	v, err := strconv.Atoi(s.String())
	return uint32(v), err
}

func (s StrTo) Int64() (int64, error) {
	v, err := strconv.Atoi(s.String())
	return int64(v), err
}

func (s StrTo) MustUInt32() uint32 {
	v, _ := s.UInt32()
	return v
}

func (s StrTo) MustUint64() uint64 {
	v, _ := s.UInt64()
	return v
}

func (s StrTo) MustInt64() int64 {
	v, _ := s.Int64()
	return v
}

func (s StrTo) MustUInt8() uint8 {
	v, _ := s.UInt32()
	return uint8(v)
}

func (s StrTo) MustFloat32() float32 {
	v, _ := strconv.ParseFloat(s.String(), 32)
	return float32(v)
}

func (s StrTo) MustFloat64() float64 {
	if len(s.String()) == 0 {
		return 0
	}
	v, _ := strconv.ParseFloat(s.String(), 32)
	return v
}

func (s StrTo) HexUInt32() uint32 {
	str := s.String()[2:]
	n, _ := strconv.ParseUint(str, 16, 32)
	return uint32(n)
}

func (s StrTo) UInt64() (uint64, error) {
	v, err := strconv.Atoi(s.String())
	if err != nil {
		return 0, err
	}
	return uint64(v), nil
}

func (s StrTo) MustUint64Native() uint64 {
	v, _ := s.UInt64()
	return v
}
